import 'dart:async';

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class ProviderDemoPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print('ProviderDemoPage.buildddd');

    return Scaffold(
      appBar: AppBar(
        title: Text('Provider 的基本使用'),
        centerTitle: true,
        leading: IconButton(
          icon: Icon(Icons.arrow_back, color: Colors.white),
          onPressed: () {},
        ),
      ),
      body: Container(
        alignment: AlignmentDirectional.centerStart,
        color: Colors.white,
        margin: EdgeInsets.all(10),
        child: Column(
          children: <Widget>[
            //这个做可以局部更新，被点击的组件
            ChangeNotifierProvider<Counter>(
              create: (BuildContext context) {
                return Counter();
              },
              //lazy: true,
              child: Consumer<Counter>(
                builder: (context, mCounter, _) {
                  return RaisedButton(
                    child: Text('点击=${mCounter.count}'),
                    onPressed: () {
                      //调用数据模型中的increment方法更改数据
                      mCounter.increment();
                    },
                  );
                },
              ),
            ),

            ///该方法，会让build方法，重新执行，全局更新
            /*  RaisedButton(
              child: Text('点击'),
              onPressed: () {
                //调用数据模型中的increment方法更改数据
                Provider.of<Counter>(context, listen: false).increment();
              },
            ),
            Text("12222=${Provider.of<Counter>(context).count}"),*/
          ],
        ),
      ), // This
    );
  }
}

/**
 * 计数器类Counter即为数据Model,实际上就是状态。
 * Counter不仅储存了数据，而且还包含了更改数据的方法，并暴露相关数据。
 * 使用mixin混入ChangeNotifier类，这个类能够自动管理所有听众。
 * 当调用notifyListeners时，它会通知所有听众进行刷新。
 */
class Counter with ChangeNotifier {
  //存储数据
  int _count = 0;

  //提供外部能够访问的数据
  int get count => _count;

  //提供更改数据的方法
  void increment() {
    _count++;
    //通知所有听众进行刷新
    //print('Counter.increment  _count=${_count}');
    notifyListeners();
  }
}
